/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package PanelesDePlatos;

import PanelesDeTrabajo.PanelPrincipalPlato;
import com.google.gson.Gson;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.table.DefaultTableModel;
import net.miginfocom.swing.MigLayout;
import com.google.gson.Gson;
import java.awt.Color;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.FileNotFoundException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Karlitox
 */
public class CrearPlato extends JPanel implements ActionListener, MouseListener, KeyListener
{
    private JPanel panelDatos;
    private JPanel panelTabla;
    private JPanel panelDescripcion;
    private JPanel panelFoto;
    private JPanel panelBotonesAbajo;
    private JLabel labelNombre, labelFotoVacia, labelFotoVisible,labelPrecio, labelIngrediente, labelPeso, labelAporteCalorico, labelDescripcion, labelRecomendacion, labelFoto;
    private JTextField textoNombre, textoPrecio, textoIngrediente, textoPeso, textoAporteCalorico;
    private JTextArea areaDescripcion, areaRecomendacion;
    private JButton buscarFoto, agregarIngrediente, crearPlato, eliminarIngrediente, flechaIzquierda, flechaDerecha;
    private JTable tabla;
    private DefaultTableModel modelo;
    private JScrollPane scroll, scrollDescripcion, scrollRecomendacion;
    private ImageIcon icon;
    private String rutaAbsolutaImg;
    private int filaTabla;
    private int indiceImagen = 0;
    private boolean platoAgregado = false;
    private ArrayList<Plato> platos = new ArrayList<Plato>();
    private ArrayList<String> imagenes = new ArrayList<String>();
    private Gson gson = new Gson();
    
    public CrearPlato()
    {
        this.setLayout(new BorderLayout());
        
        icon = new ImageIcon("src/Resource/sin_foto.PNG");
        rutaAbsolutaImg = "src/Resource/sin_foto.PNG";
        ImageIcon icon2 = new ImageIcon(icon.getImage().getScaledInstance(100, 130, Image.SCALE_DEFAULT));
        
        this.panelDatos = new JPanel();
        this.panelDatos.setLayout(new MigLayout());
        
        this.panelTabla = new JPanel();
        this.panelTabla.setLayout(new MigLayout());
        
        this.panelDescripcion = new JPanel();
        this.panelDescripcion.setLayout(new MigLayout());
        
        this.panelBotonesAbajo = new JPanel();
        this.panelBotonesAbajo.setLayout(new BorderLayout());
        
        this.panelFoto = new JPanel();
        this.panelFoto.setSize(new Dimension(10, 10));
        this.panelFoto.setLayout(new MigLayout());
        this.labelFotoVisible = new JLabel(icon2);
        this.panelFoto.add(labelFotoVisible);
        
        this.labelNombre = new JLabel("Nombre");
        this.labelFotoVacia = new JLabel("Foto");
        this.labelPrecio = new JLabel("Precio $");
        this.labelIngrediente = new JLabel("Ingrediente");
        this.labelPeso = new JLabel("Peso Kg");
        this.labelAporteCalorico = new JLabel("Aporte Calórico");
        this.labelDescripcion = new JLabel("Descripción");
        this.labelRecomendacion = new JLabel("Recomendación");
        this.labelFoto = new JLabel();
        
        this.textoNombre = new JTextField(20);
        this.textoPrecio = new JTextField(20);
        this.textoIngrediente = new JTextField(20);
        this.textoPeso = new JTextField(20);
        this.textoAporteCalorico = new JTextField(20);
        
        this.areaDescripcion = new JTextArea(5, 25);
        this.areaRecomendacion = new JTextArea(5, 25);
        
        this.buscarFoto = new JButton("Examinar");
        this.agregarIngrediente = new JButton("Agregar");
        this.crearPlato = new JButton();
        this.crearPlato.setIcon(new ImageIcon("src/Resource/crearMenu.PNG"));
        this.crearPlato.setBorder(null);
        this.eliminarIngrediente = new JButton();
        this.eliminarIngrediente.setIcon(new ImageIcon("src/Resource/eliminar.PNG"));
        this.eliminarIngrediente.setBorder(null);
        this.flechaDerecha = new JButton();
        this.flechaIzquierda = new JButton();
        this.flechaDerecha.setIcon(new ImageIcon("src/Resource/flecha_derecha.PNG"));
        this.flechaIzquierda.setIcon(new ImageIcon("src/Resource/flecha_izquierda.PNG"));
        
        this.crearPlato.addActionListener(this);
        this.agregarIngrediente.addActionListener(this);
        this.eliminarIngrediente.addActionListener(this);
        this.buscarFoto.addActionListener(this);
        this.flechaDerecha.addActionListener(this);
        this.flechaIzquierda.addActionListener(this);
        
        this.textoPrecio.addKeyListener(this);
        this.textoPeso.addKeyListener(this);
        this.textoAporteCalorico.addKeyListener(this);
        
        this.modelo = new DefaultTableModel()
        {
            public boolean isCellEditable(int row, int column) //Las celdas no son editables
            {
                if (row<tabla.getRowCount())
                {
                    return false;
                }
            return true;
            }
        };
        this.tabla = new JTable(modelo);
        this.tabla.getTableHeader().setReorderingAllowed(false);
        this.tabla.addMouseListener(this);
        this.modelo.addColumn("Nombre Ingredientes");
        this.scroll = new JScrollPane(tabla);
        this.scroll.setViewportView(tabla);
        this.scrollDescripcion = new JScrollPane(areaDescripcion);
        this.scrollRecomendacion = new JScrollPane(areaRecomendacion);
        
        this.panelFoto.add(flechaIzquierda);
        this.panelFoto.add(flechaDerecha);
        
        this.panelDatos.add(labelNombre);
        this.panelDatos.add(textoNombre);
        this.panelDatos.add(labelPeso);
        this.panelDatos.add(textoPeso, "wrap");
        this.panelDatos.add(labelFotoVacia);
        this.panelDatos.add(buscarFoto);
        this.panelDatos.add(labelIngrediente);
        this.panelDatos.add(textoIngrediente);
        this.panelDatos.add(agregarIngrediente, "wrap");
        this.panelDatos.add(labelPrecio);
        this.panelDatos.add(textoPrecio);
        this.panelDatos.add(labelAporteCalorico);
        this.panelDatos.add(textoAporteCalorico, "wrap");
        
        this.panelTabla.add(scroll, "wrap");
        
        this.panelDescripcion.add(panelFoto, "wrap");
        this.panelDescripcion.add(labelDescripcion, "wrap");
        this.panelDescripcion.add(scrollDescripcion, "wrap");
        this.panelDescripcion.add(labelRecomendacion, "wrap");
        this.panelDescripcion.add(scrollRecomendacion, "wrap");
        
        this.panelBotonesAbajo.add(eliminarIngrediente, BorderLayout.WEST);
        this.panelBotonesAbajo.add(crearPlato, BorderLayout.EAST);
        
        this.add(panelDatos, BorderLayout.NORTH);
        this.add(panelTabla, BorderLayout.WEST);
        this.add(panelDescripcion, BorderLayout.EAST);
        this.add(panelBotonesAbajo, BorderLayout.SOUTH);
        
        habilitarEliminacion();
    }

    @Override
    public void actionPerformed(ActionEvent e) 
    {
        Object click = e.getSource();
        
        boolean nombreVacio = textoNombre.getText().isEmpty();
        boolean precioVacio = textoPrecio.getText().isEmpty();
        boolean ingredienteVacio = textoIngrediente.getText().isEmpty();
        boolean aporteCaloricoVacio = textoAporteCalorico.getText().isEmpty();
        boolean descripcionVacio = areaDescripcion.getText().isEmpty();
        boolean recomendacionVacio = areaRecomendacion.getText().isEmpty();
        
        if (click == crearPlato)
        {
            if (nombreVacio || precioVacio || aporteCaloricoVacio || descripcionVacio ||
                recomendacionVacio || modelo.getRowCount() == 0) //Está vacío?
            {
                JOptionPane.showMessageDialog(this, "Faltan campos por completar y/o ingredientes por agregar, por favor complete todos los campos pedidos.");
            }
            else
            {
                String nombre = textoNombre.getText();
                int precio = Integer.parseInt(textoPrecio.getText());
                float peso = Float.parseFloat(textoPeso.getText());
                int aporteCalorico = Integer.parseInt(textoAporteCalorico.getText());
                String descripcion = areaDescripcion.getText();
                String recomendacion = areaRecomendacion.getText();
                
                Plato plato = new Plato(nombre, precio, peso, aporteCalorico, descripcion, recomendacion, null, imagenes);
                
                if (!estaEnPlatos(plato))
                {
                    platos.add(plato);
                    agregarIngredientes(plato);
                    platoAgregado = true;
                    guardarPlatosTxt(plato);
                    camposEnBlanco();
                    JOptionPane.showMessageDialog(this, "Su plato fue agregado con éxito");
                }
                else
                {
                    JOptionPane.showMessageDialog(this, "Ya existe un plato con éste nombre, por favor busque otro nombre");
                }
            }
        }
        if (click == agregarIngrediente)
        {
            if (ingredienteVacio)
            {
                JOptionPane.showMessageDialog(this, "No se ha especificado algún ingrediente, por favor agregue un ingrediente.");
            }
            else
            {
                Object[] ingrediente = new Object[1];
                ingrediente[0] = textoIngrediente.getText();
                this.modelo.addRow(ingrediente);
                this.textoIngrediente.setText("");
                this.eliminarIngrediente.setEnabled(true);
            }
        }
        if (click == eliminarIngrediente)
        {
            this.modelo.removeRow(filaTabla);
            habilitarEliminacion();
        }
        if (click == buscarFoto)
        {
            JFileChooser chooser = new JFileChooser();
            FileNameExtensionFilter filtroImagen = new FileNameExtensionFilter("JPG & PNG", "jpg","png");
            chooser.setFileFilter(filtroImagen);
            chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
            int estado = chooser.showOpenDialog(null);
            
            if (estado == JFileChooser.APPROVE_OPTION)
            {
                File archivo = chooser.getSelectedFile();
                rutaAbsolutaImg = archivo.getAbsolutePath();
                ImageIcon imagen = new ImageIcon(archivo.getAbsolutePath());
                ImageIcon imagen2 = imagenRedimensionada(imagen);
                JOptionPane.showMessageDialog(this, "Su imagen fue agregada con éxito");
                imagenes.add(rutaAbsolutaImg);
                indiceImagen++;
                this.labelFotoVisible.setIcon(imagen2);
            }
        }
        if (click == flechaDerecha)
        {
            cambiarImagen("derecha");
        }
        if (click == flechaIzquierda)
        {
            cambiarImagen("izquierda");
        }
    }
    
    @Override
    public void mouseClicked(MouseEvent e) 
    {
        if (e.getClickCount() == 1)
        {
            this.filaTabla = tabla.rowAtPoint(e.getPoint()); //Obtenemos la fila donde se ha hecho click
        }
    }

    @Override
    public void mousePressed(MouseEvent e) 
    {
        
    }

    @Override
    public void mouseReleased(MouseEvent e) 
    {
        
    }

    @Override
    public void mouseEntered(MouseEvent e) 
    {
        
    }

    @Override
    public void mouseExited(MouseEvent e) 
    {
        
    }
    
    @Override
    public void keyTyped(KeyEvent e) 
    {
        // enteros: precio,  aporte. decimal: valoracion, peso
        boolean primero = true;
        Object comp = e.getComponent();
        int key = (int)e.getKeyChar();
        
        if (comp == textoPeso)
        {
            if ((key >= 97 && key <= 122) || (key >= 65 && key <= 90)) //Para validar si poseen alguna letra
            {
                e.consume();
            }
            else //si se ha ingresado numero
            {
                if (key == 46) //Pregunta si lo ingresado es un punto
                {
                    if (primero) //Preguntamos si es el primer punto digitado
                    {
                        primero = false;
                    }
                    else
                    {
                        e.consume();
                    }
                }
            }
        }
        if (comp == textoPrecio || comp == textoAporteCalorico)
        {
            if ((key >= 97 && key <= 122) || (key >= 65 && key <= 90)) //Para validar si poseen alguna letra
            {
                e.consume();
            }
            else
            {
                if (key == 46)
                {
                    e.consume();
                }
            }
        }
    }

    @Override
    public void keyPressed(KeyEvent e) 
    {
        
    }

    @Override
    public void keyReleased(KeyEvent e) 
    {
        
    }
    
    public void camposEnBlanco()
    {
        textoNombre.setText("");
        textoIngrediente.setText("");
        textoPeso.setText("");
        textoAporteCalorico.setText("");
        textoPrecio.setText("");
        areaDescripcion.setText("");
        areaRecomendacion.setText("");
        rutaAbsolutaImg = "src/Resource/sin_foto.PNG";
        imagenes.clear();
        ImageIcon icon2 = new ImageIcon(rutaAbsolutaImg);
        ImageIcon icon3 = new ImageIcon(icon2.getImage().getScaledInstance(100, 130, Image.SCALE_DEFAULT));
        labelFotoVisible.setIcon(icon3);
        
        while (modelo.getRowCount() > 0)
        {
            modelo.removeRow(0);
        }
    }
    
    public void habilitarEliminacion()
    {
        if (modelo.getRowCount() == 0)
        {
            this.eliminarIngrediente.setEnabled(false);
        }
        else
        {
            this.eliminarIngrediente.setEnabled(true);
        }
    }
    
    public ArrayList<Plato> getPlatos()
    {
        return this.platos;
    }
    
    public int cantidadPlatos()
    {
        return platos.size();
    }
    
    public boolean getPlatoAgregado()
    {
        return platoAgregado;
    }
    
    public void setPlatoAgregado(boolean platoAgregado)
    {
        this.platoAgregado = platoAgregado;
    }
    
    public ImageIcon imagenRedimensionada(ImageIcon icon)
    {
        if (icon.getIconHeight() > 100 && icon.getIconHeight() > 130)
        {
            ImageIcon icon2 = new ImageIcon(icon.getImage().getScaledInstance(100, 130, Image.SCALE_DEFAULT));
            return icon2;
        }
        else
        {
            return icon;
        }
    }
    
    public void cambiarImagen(String direccion)
    {
        ImageIcon icon;
        ImageIcon icon2;
        
        if (imagenes.size() > 0)
        {
            if (direccion.equals("derecha"))
            {
                if ((indiceImagen + 1) < imagenes.size()) //Preguntamos si hay una imagen siguiente
                {
                    icon = new ImageIcon(imagenes.get(indiceImagen + 1));
                    icon2 = new ImageIcon(icon.getImage().getScaledInstance(100, 130, Image.SCALE_DEFAULT));
                    labelFotoVisible.setIcon(icon2); //Mostramos la imagen siguiente
                    indiceImagen++;
                }
                else
                {
                    icon = new ImageIcon(imagenes.get(0));
                    icon2 = new ImageIcon(icon.getImage().getScaledInstance(100, 130, Image.SCALE_DEFAULT));
                    labelFotoVisible.setIcon(icon2);
                    indiceImagen = 0;
                }
            }
            else
            {
                if ((indiceImagen - 1) >= 0) //Si aquel indice esta dentro del rango
                {
                    icon = new ImageIcon(imagenes.get(indiceImagen - 1));
                    icon2 = new ImageIcon(icon.getImage().getScaledInstance(100, 130, Image.SCALE_DEFAULT));
                    labelFotoVisible.setIcon(icon2); //Mostramos la imagen anterior
                    indiceImagen--;
                }
                else
                {
                    int indiceUltima = imagenes.size() - 1;
                    icon = new ImageIcon(imagenes.get(indiceUltima));
                    icon2 = new ImageIcon(icon.getImage().getScaledInstance(100, 130, Image.SCALE_DEFAULT));
                    labelFotoVisible.setIcon(icon2);
                    indiceImagen = indiceUltima;
                }
            }
        }
    }
    
    public void agregarIngredientes(Plato plato)
    {
        for (int i=0; i<modelo.getRowCount(); i++)
        {
            Object objeto = modelo.getValueAt(i,0);
            String ingrediente = objeto.toString();
            plato.agregarIngrediente(ingrediente);
        }
    }
    
    public void guardarPlatosTxt(Plato plato)
    {
        String json = gson.toJson(plato);
        
        try
        {
            FileWriter writer = new FileWriter("C:\\BaseDeDatos\\platos.txt", true);
            writer.write(json);
            writer.write("\n");
            writer.close();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
    
    public void leerPlatosTxt()
    {
        File archivo = null;
        FileReader fr = null;
        BufferedReader br = null;
        platos.clear();
        
        try
        {
            archivo = new File ("C:\\BaseDeDatos\\platos.txt");
            fr = new FileReader (archivo);
            br = new BufferedReader(fr);
            
            String linea;
            
            while((linea=br.readLine())!=null)
            {
                Plato plato = (Plato)gson.fromJson(linea, Plato.class);
                platos.add(plato);
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        finally
        {
            try
            {
                if( null != fr )
                {   
                    fr.close();     
                }                  
            }
            catch (Exception e2)
            {
                e2.printStackTrace();
            }
        }
    }
    
    public boolean estaEnPlatos(Plato plato)
    {
        for (int i=0; i<platos.size(); i++)
        {
            if (plato.getNombre().equals(platos.get(i).getNombre()))
            {
                return true; //Esta
            }
        }
        return false; //No esta
    }
    
    public ArrayList<String> getImagenes()
    {
        return imagenes;
    }

    private void mostrar() 
    {
        for (int i=0; i<platos.size(); i++)
                    {
                        System.out.println(platos.get(i).getNombre());
                    }
    }
}